//
//  YXStatus.swift
//  yanXiangWeiBo
//
//  Created by 颜祥 on 15/12/22.
//  Copyright © 2015年 yanxiang. All rights reserved.
//

import UIKit

// MARK: - 微博模型
class YXStatus: NSObject
{
    // MARK: - 1.定义属性
    
    // 微博创建时间
    var created_at: String?
    
    // 微博信息内容
    var text: String?
    
    // 微博ID
    var id: Int64 = 0
    
    // 微博来源
    var source: String?
    
    // 微博配图 :数组，里面的元素是字典
    var pic_urls: [[String: AnyObject]]?
    {
        didSet
        {
            // 1.没有图片
            let count = pic_urls?.count ?? 0
            
            if count == 0
            {
                return
            }
            
            // 2.有图片
            // 创建storePicUrl
            storePicUrls = [NSURL]()
            
            for dict in pic_urls!
            {
                let URLString = dict["thumbnail_pic"] as! String
                
                let url = NSURL(string: URLString)
                
                // 添加到数组中
                storePicUrls?.append(url!)
            }
        }
    }
    
    // 保存微博配图的URL
    var storePicUrls: [NSURL]?
    
    // 被转发的原微博信息字段，当该微博为转发微博时返回
    var retweeted_status: YXStatus?
    
    // 转发数
    var reposts_count: Int?
    
    // 评论数
    var comments_count: Int?
    
    // 表态数
    var attitudes_count: Int?
    
    // 用户模型
    var user: YXUser?
    
    // 缓存行高,如果为nil则没有缓存行高
    var rowHeight: CGFloat?
    
    
   
    
    
    // MARK: - 2.字典转模型
    init(dict: [String: AnyObject])
    {
        super.init()
        
        // KVC
        setValuesForKeysWithDictionary(dict)
    }
    
    // 字典的key在模型中找不到对应的属性，需要实现这个方法
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {}
    
    
    // setValuesForKeysWithDictionary(dict)中传入的key有多少个就会调用多少次，并且传入相应的key和value
    override func setValue(value: AnyObject?, forKey key: String)
    {
        // 判断如果key是user,字典转模型
        if key == "user"
        {
            if let dict = value as? [String: AnyObject]
            {
                // 字典转模型
                let userModel = YXUser(dict: dict)
                
                // 将模型赋值给属性user
                self.user = userModel
            }
            
            // 一定要记得return，不让会调用父类的setValue方法覆盖
            return
        }
        
        super.setValue(value, forKey: key)
    }
    
    
    
    // 实现description属性
    override var description: String
    {
        let prop = ["created_at","text","id","source","pic_urls","retweeted_status","reposts_count","comments_count","attitudes_count"]
        // 通过一个数组来生成一个字典，数组中的元素会成为字典的key，key所对应的value,会从模型中找对应的属性值
        let dict = dictionaryWithValuesForKeys(prop)
        
        return "\n\t微博模型: \(dict)"
    }
    
    // MARK: - 加载微博数据
    // 准备好闭包，返回加载完成的数据
    class func modelLoadStatus(finished: (statuses: [YXStatus]?, error: NSError?) -> ())
    {
        // 1.调用网络工具加载的微博数据
        YXNetWorkTool.sharedInstance.loadStatus { (result, error) -> () in
            
            // 1.如果加载错误
            if error != nil && result == nil
            {
                // 将错误返回给调用者(控制器)
                finished(statuses: nil, error: error)
                return
            }
            
            // 2.加载成功
            // 解析加载完成的微博数据,得到的是一个字典，字典中的key---statuses对应的是一个数组，数组中的元素是字典
            if let dictArr = result!["statuses"] as? [[String: AnyObject]]
            {
            
            // 定义一个可变数组，用来保存微博对象
            var statuses =  [YXStatus]()
            
            // 遍历字典数组
                for dict in dictArr
                {
                    // 字典转模型，得到微博模型对象
                    let status = YXStatus(dict: dict)
                    
                    // 将微博模型对象添加到可变数组中
                    statuses.append(status)
                }
                
            // 将模型对象属性回调给调用者(控制器)
            finished(statuses: statuses, error: nil)
                
            }else
            {
                finished(statuses: nil, error: nil)
            }
            
        }
    }
    
   
}
